package io.github.jianjianghui.groot.core;

import io.github.jianjianghui.groot.core.annotation.Idempotent;

import java.util.Arrays;
import java.util.Objects;
import java.util.StringJoiner;

/**
 * 幂等
 *
 * @author <a href="https://www.github.com/jianjianghui">Jianghui Jian<a/>
 * @date 2021/8/27 - 13:21
 */
public class Groot {
    private Idempotent idempotent;
    private GrootRequest grootRequest;


    public Groot(Idempotent idempotent, GrootRequest grootRequest) {
        this.idempotent = idempotent;
        this.grootRequest = grootRequest;
    }

    public static Groot create(Idempotent idempotent, GrootRequest grootRequest) {
        return new Groot(idempotent, grootRequest);
    }


    public boolean requestStatusExistInIdempotentAccessible() {
        return Arrays.stream(idempotent.accessible()).anyMatch(grootStatusEnum -> Objects.equals(grootStatusEnum, grootRequest.getStatusEnum()));
    }


    public Idempotent getIdempotent() {
        return idempotent;
    }

    public void setIdempotent(Idempotent idempotent) {
        this.idempotent = idempotent;
    }

    public GrootRequest getGrootRequest() {
        return grootRequest;
    }

    public void setGrootRequest(GrootRequest grootRequest) {
        this.grootRequest = grootRequest;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }

        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        Groot groot = (Groot) o;
        return Objects.equals(idempotent, groot.idempotent) && Objects.equals(grootRequest, groot.grootRequest);
    }

    @Override
    public int hashCode() {
        return Objects.hash(idempotent, grootRequest);
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", Groot.class.getSimpleName() + "[", "]")
                .add("idempotent=" + idempotent)
                .add("grootRequest=" + grootRequest)
                .toString();
    }
}
